/**
 * 
 */
package neptune.manager.completer;

import neptune.manager.model.topology.NetworkInterface;
import neptune.manager.model.topology.Node;
import neptune.manager.model.topology.Topology;

/**
 * Classe astratta che realizza il completamento di un nodo. Va implementato il
 * metodo algorithm per realizzare l'algoritmo da adoperare per il completamento
 * del nodo. Il metodo {@link NodeCompleter#completeNode(Node)} chiama
 * innanzitutto il metodo {@link NodeCompleter#algorithm(Node)}, successivamente
 * avvia il completamento per ogni interfaccia di rete, adoperando il
 * {@link NetworkInterfaceCompleter} passato come argomento al costruttore di
 * questa clase.
 * 
 * @author Roberto Bifulco [info@RobertoBifulco.it] [RobertoBifulco.it]
 * 
 */
public abstract class NodeCompleter {

	private NetworkInterfaceCompleter netComp;

	public NodeCompleter(NetworkInterfaceCompleter netComp) {
		super();
		this.netComp = netComp;
	}

	/**
	 * Avvia il completamento del nodo. La prima operazione eseguita e' la
	 * chiamata al metodo algorithm
	 * 
	 * @param node
	 * @throws CompleterException
	 */
	public void completeNode(Node node, Topology actual)
			throws CompleterException {
		algorithm(node, actual);
		for (NetworkInterface netIf : node.getInterfaces()) {
			netComp.completeInterface(netIf, actual);
		}
	}

	/**
	 * Metodo astratto da implementare per specificare quali operazioni eseguire
	 * sul nodo.
	 * 
	 * @param node
	 */
	public abstract void algorithm(Node node, Topology actual);
}
